#ifndef __TFTSPI_H_
#define __TFTSPI_H_

#include <stdio.h>
#include <stdbool.h>
#include "sdkconfig.h"
#include "esp_err.h"
#include "esp_intr_alloc.h"
#include "soc/soc_caps.h"
#include "hal/gpio_types.h"
#include "esp_rom_gpio.h"
#include "driver/gpio.h"
#include "driver/gpio_etm.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define OLED_COLUMN_NUMBER 240
#define OLED_LINE_NUMBER 320
#define OLED_COLUMN_OFFSET 0

/* 24-bit RGB 宏定义 */
#define RED     0xFF0000   /* 红 */
#define ORANGE  0xFF7F00   /* 橙 */
#define YELLOW  0xFFFF00   /* 黄 */
#define GREEN   0x00FF00   /* 绿 */
#define CYAN    0x00FFFF   /* 青 */
#define BLUE    0x0000FF   /* 蓝 */
#define PURPLE  0x8B00FF   /* 紫 */
#define BLACK   0x000000   /* 黑 */
#define WHITE   0xFFFFFF   /* 白 */


extern const unsigned char china_char[][128];
extern const unsigned char asc32x32[10][64];

/* 飞线引脚定义,SPI引脚分配，连接oled屏，更具实际情况修改
GPIO46  -   CS;
GPIO9   -   SCK;
GPIO10  -   SDA;
GPIO11  -   DC;
GPIO12  -   RST。
*/

// #define CS_GPIO_PIN     GPIO_NUM_46     /* CS连接的GPIO端口 */
// #define SCK_GPIO_PIN    GPIO_NUM_9      /* SCK连接的GPIO端口 */
// #define SDA_GPIO_PIN    GPIO_NUM_10     /* SDA连接的GPIO端口 */
// #define DC_GPIO_PIN     GPIO_NUM_11     /* DC连接的GPIO端口 */
// #define RST_GPIO_PIN    GPIO_NUM_12     /* RST连接的GPIO端口 */

/* 开发板设计GPIO */
#define CS_GPIO_PIN     GPIO_NUM_41     /* CS连接的GPIO端口 */
#define SCK_GPIO_PIN    GPIO_NUM_21      /* SCK连接的GPIO端口 */
#define SDA_GPIO_PIN    GPIO_NUM_47     /* SDA连接的GPIO端口 */
#define DC_GPIO_PIN     GPIO_NUM_40     /* DC连接的GPIO端口 */
#define RST_GPIO_PIN    GPIO_NUM_45     /* RST连接的GPIO端口 */
#define BL_GPIO_PIN    GPIO_NUM_42     /* BL连接的GPIO端口 */

/* 引脚的输出的电平状态 */
enum TFTSPI_OUTPUT_STATE
{
    TFTSPI_PIN_RESET = 0,
    TFTSPI_PIN_SET = 1
};

/* CS电平设置 */
#define CS_SET_LEVEL(x)          do { x ?                                  \
                             gpio_set_level(CS_GPIO_PIN, TFTSPI_PIN_SET) : \
                             gpio_set_level(CS_GPIO_PIN, TFTSPI_PIN_RESET);\ 
                        } while(0)  /* LED翻转 */
/* SCK电平设置 */
#define SCK_SET_LEVEL(x)          do { x ?                                  \    
                             gpio_set_level(SCK_GPIO_PIN, TFTSPI_PIN_SET) : \ 
                             gpio_set_level(SCK_GPIO_PIN, TFTSPI_PIN_RESET);\
                        } while(0)  /* LED翻转 */
/* SDA电平设置 */
#define SDA_SET_LEVEL(x)          do { x ?                                  \    
                             gpio_set_level(SDA_GPIO_PIN, TFTSPI_PIN_SET) : \ 
                             gpio_set_level(SDA_GPIO_PIN, TFTSPI_PIN_RESET);\ 
                        } while(0)  /* LED翻转 */
/* DC电平设置 */
#define DC_SET_LEVEL(x)          do { x ?                                 \     
                             gpio_set_level(DC_GPIO_PIN, TFTSPI_PIN_SET) :\  
                             gpio_set_level(DC_GPIO_PIN, TFTSPI_PIN_RESET);\
                        } while(0)  /* LED翻转 */
/* RST电平设置 */
#define RST_SET_LEVEL(x)          do { x ?                                  \    
                             gpio_set_level(RST_GPIO_PIN, TFTSPI_PIN_SET) : \
                             gpio_set_level(RST_GPIO_PIN, TFTSPI_PIN_RESET);\ 
                        } while(0)  /* LED翻转 */
/* BL电平设置 */
#define BL_SET_LEVEL(x)          do { x ?                                  \    
                             gpio_set_level(BL_GPIO_PIN, TFTSPI_PIN_SET) : \
                             gpio_set_level(BL_GPIO_PIN, TFTSPI_PIN_RESET);\ 
                        } while(0)  /* LED翻转 */

#define SPI_CS_0      CS_SET_LEVEL(0)       //复位
#define SPI_CS_1      CS_SET_LEVEL(1)       //置位
#define SPI_SCK_0     SCK_SET_LEVEL(0)      //复位
#define SPI_SCK_1     SCK_SET_LEVEL(1)      //置位
#define SPI_SDA_0     SDA_SET_LEVEL(0)      //复位
#define SPI_SDA_1     SDA_SET_LEVEL(1)      //置位
#define SPI_DC_0      DC_SET_LEVEL(0)       //复位
#define SPI_DC_1      DC_SET_LEVEL(1)       //置位
#define SPI_RST_0     RST_SET_LEVEL(0)      //复位
#define SPI_RST_1     RST_SET_LEVEL(1)      //置位
#define SPI_BL_0      BL_SET_LEVEL(0)      //复位
#define SPI_BL_1      BL_SET_LEVEL(1)      //置位

void IO_init(void);
void delay_us(unsigned int _us_time);
void delay_ms(unsigned int _ms_time);
void SPI_SendByte(unsigned char byte);
void TFT_SEND_CMD(unsigned char o_command);
void TFT_SEND_DATA(unsigned char o_data);
void OLED_clear(void);
void OLED_full(unsigned long color);
void OLED_init(void);
void Picture_display(const unsigned char *ptr_pic);
void display_char16_16(unsigned int x,unsigned int y,unsigned long color,const unsigned char *point);
void display_char32_32(unsigned int x, unsigned int y, unsigned long color, const unsigned char *point);
void Picture_ReverseDisplay(const unsigned char *ptr_pic);
void OLED_Color_test(void);
void lcd_print_u16_mv(uint16_t x, uint16_t y, uint32_t value, uint32_t color);
void display_title16(uint16_t x, uint16_t y, uint32_t color, const char *str16);

#endif
